package com.woniu.service;

import com.woniu.entity.CategoryCourse;
import com.woniu.entity.Course;
import com.woniu.entity.PageResult;
import com.woniu.entity.vo.CourseVO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * (Course)表服务接口
 *
 * @author makejava
 * @since 2025-06-09 18:58:17
 */
public interface CourseService {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    Course queryById(Long id);

    /**
     * 通过课程ID获取课程信息
     * @param courseId
     * @return
     */
    CourseVO getCourseVOById(Integer courseId);

    PageResult findAllCourse(Integer pageNum, Integer pageSize);
    List<Course> findAllCourseOrderByViewCount();
    List<Course> findAllCourseOrderByBuyCount();


    List<Long> findAllLeafNodeIdsByCategoryId(Integer categoryId);

    PageResult queryCourseByCourseIdList(Integer categoryId, Integer pageNum, Integer pageSize);

    PageResult findByCondition(String title, String teacherName, Integer enable, Integer pageNum, Integer pageSize);


    /**
     * 推荐课程（收藏量前四）
     */
    List<Course> getRecommendCourses();

    /**
     * 最受欢迎课程（观看人数前四）
     */
    List<Course> getPopularCourses();

    /**
     * 新增数据
     */
    int insert(Course course);

    /**
     * 修改数据
     */
    int update(Course course);

    /**
     * 通过主键删除数据
     */
    int deleteById(Long id);

    /**
     * 添加课程类别关联
     */
    void addCourseCategory(CategoryCourse categoryCourse);

    /**
     * 删除课程关联的所有类别
     */
    @Transactional
    void deleteCourseCategories(Integer courseId);

    /**
     * 获取课程关联的类别
     */
    List<CategoryCourse> getCourseCategories(Integer courseId);

    // 检查是否已存在相同关联
    CategoryCourse checkCategoryCourseExist(Integer courseId, Integer categoryId);

    /**
     * 收藏榜TOP5课程
     */
    List<Course> getFavoriteRankings();

    int countByTeacherId(Long teacherId);

    PageResult getCourseByTeacherId(Long teacherId,Integer pageNum, Integer pageSize);
}
